package com.ceair.controller;

import com.ceair.entity.request.*;
import com.ceair.entity.result.Result;
import com.ceair.entity.vo.CirculationRecordsVO;
import com.ceair.entity.vo.MyCompleteTaskListInfoVO;
import com.ceair.entity.vo.MyStartTaskListInfoVO;
import com.ceair.entity.vo.TaskListInfoVO;
import com.ceair.service.IMayTaskService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.api.FlowableException;
import org.flowable.engine.TaskService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author wangbaohai
 * @ClassName MyTaskController
 * @description: 任务信息相关接口
 * @date 2025年05月01日
 * @version: 1.0.0
 */
@RestController
@RequestMapping("/api/v1/myTask")
@RequiredArgsConstructor
@Slf4j
@Tag(name = "我的任务信息管理", description = "我的任务信息相关接口")
public class MyTaskController {

    private final IMayTaskService mayTaskService;
    private final TaskService taskService;

    /**
     * 分页查询我的待办任务。
     * <p>
     * 权限控制：需要拥有 '/api/v1/task/myTodoTask' 权限才能访问。
     * 接口参数：分页请求对象（pageReq），用于指定分页信息。
     * 接口用途：在API文档中标识该接口的功能为“分页查询我的待办任务”。
     * 请求方式：POST 请求，路径为 "/myTodoTask"。
     *
     * @param pageReq 分页请求对象，包含分页参数（页码、页大小等）。
     * @return Result<TaskListInfoVO> 返回封装后的分页任务列表信息。
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/myTask/myTodoTask')")
    @Parameter(name = "pageReq", description = "分页请求对象", required = true)
    @Operation(summary = "分页查询我的待办任务")
    @PostMapping("/myTodoTask")
    public Result<TaskListInfoVO> myTodoTask(@RequestBody PageReq pageReq) {
        try {
            // 调用业务层查询我的待办任务
            TaskListInfoVO taskListInfoVO = mayTaskService.myTodoTask(pageReq);

            // 返回封装后的分页任务列表信息
            return Result.success(taskListInfoVO);
        } catch (Exception e) {
            log.error("查询我的待办任务失败，原因：{}", e.getMessage());
            return Result.error("查询我的待办任务失败，原因：" + e.getMessage());
        }
    }

    /**
     * 审批我的待办任务。
     * <p>
     * 权限: /api/v1/myTask/approvalMyTask
     * 参数: approvalMyTaskReq - 包含任务ID的审批请求对象
     * 返回: Result<Boolean> 表示审批是否成功
     * <p>
     * 异常处理：
     * - 任务ID为空 → 参数错误
     * - Flowable异常 → 返回审批失败信息
     * - 其他异常 → 系统异常提示
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/myTask/approvalMyTask')")
    @Parameter(name = "approvalMyTaskReq", description = "审批我的待办任务请求对象", required = true)
    @Operation(summary = "审批我的待办任务")
    @PostMapping("/approvalMyTask")
    public Result<Boolean> approvalMyTask(@RequestBody ApprovalMyTaskReq approvalMyTaskReq) {
        // 参数校验
        if (approvalMyTaskReq == null || approvalMyTaskReq.getTaskId() == null) {
            log.warn("审批失败：非法的任务ID");
            return Result.error("参数不能为空或任务ID无效");
        }

        try {
            // 调用Flowable 任务服务完成任务审批
            taskService.complete(approvalMyTaskReq.getTaskId());
            return Result.success(true);
        } catch (FlowableException | IllegalArgumentException e) {
            log.error("审批我的待办任务失败，原因：{}", e.getMessage(), e);
            return Result.error("审批我的待办任务失败，原因：" + e.getMessage());
        } catch (Exception e) {
            log.error("发生未知异常，审批失败：", e);
            return Result.error("系统异常，请联系管理员");
        }
    }

    /**
     * 任务拾取。
     * <p>
     * 权限: /api/v1/myTask/pickupMyTask
     * 参数: pickupMyTaskReq - 包含任务拾取相关信息的请求对象
     * 返回: Result<Boolean> 表示任务拾取是否成功
     * <p>
     * 异常处理：
     * - 业务层异常  返回任务拾取失败信息
     * - 其他未知异常  系统异常提示
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/myTask/pickupMyTask')")
    @Parameter(name = "pickupMyTaskReq", description = "任务拾取请求对象", required = true)
    @Operation(summary = "任务拾取")
    @PostMapping("/pickupMyTask")
    public Result<Boolean> pickupMyTask(@RequestBody PickupMyTaskReq pickupMyTaskReq) {
        try {
            // 调用业务层方法，将任务分配给当前登录用户
            return Result.success(mayTaskService.pickupMyTask(pickupMyTaskReq));
        } catch (Exception e) {
            log.error("任务拾取失败，原因：{}", e.getMessage());
            return Result.error("任务拾取失败，原因：" + e.getMessage());
        }
    }

    /**
     * 任务归还。
     * <p>
     * 权限: /api/v1/myTask/revertMyTask
     * 参数: revertMyTaskReq - 包含任务归还相关信息的请求对象
     * 返回: Result<Boolean> 表示任务归还是否成功
     * <p>
     * 异常处理：
     * - 业务层异常  返回任务归还失败信息
     * - 其他未知异常  系统异常提示
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/myTask/revertMyTask')")
    @Parameter(name = "revertMyTaskReq", description = "任务归还请求对象", required = true)
    @Operation(summary = "任务归还")
    @PostMapping("/revertMyTask")
    public Result<Boolean> revertMyTask(@RequestBody RevertMyTaskReq revertMyTaskReq) {
        try {
            // 调用业务层方法，将任务分配给当前登录用户
            return Result.success(mayTaskService.revertMyTask(revertMyTaskReq));
        } catch (Exception e) {
            log.error("任务归还失败，原因：{}", e.getMessage());
            return Result.error("任务归还失败，原因：" + e.getMessage());
        }
    }

    /**
     * 查询任务图片。
     * <p>
     * 权限: /api/v1/myTask/queryTaskImage
     * 参数: queryTaskImageReq - 包含查询任务图片所需信息的请求对象
     * 返回: Result<String> 返回封装后的任务图片信息（如图片路径或Base64数据）
     * <p>
     * 异常处理：
     * - 业务层异常  返回查询任务图片失败信息
     * - 其他未知异常  系统异常提示
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/myTask/queryTaskImage')")
    @Parameter(name = "queryTaskImageReq", description = "查询任务图片请求对象", required = true)
    @Operation(summary = "查询任务图片")
    @PostMapping("/queryTaskImage")
    public Result<String> queryTaskImage(@RequestBody QueryTaskImageReq queryTaskImageReq) {
        try {
            // 调用业务层方法，将任务分配给当前登录用户
            return Result.success(mayTaskService.queryTaskImage(queryTaskImageReq.getProcessInstanceId()));
        } catch (Exception e) {
            log.error("查询任务图片失败，原因：{}", e.getMessage());
            return Result.error("查询任务图片失败，原因：" + e.getMessage());
        }
    }

    /**
     * 分页查询我的发起任务列表。
     * <p>
     * 权限: /api/v1/myTask/queryMyStartTaskList
     * 参数: pageReq - 分页请求对象，用于指定分页信息（页码、页大小等）
     * 返回: Result<MyStartTaskListInfoVO> 返回封装后的分页任务列表信息
     * <p>
     * 异常处理：
     * - 业务层异常  返回查询任务列表失败信息
     * - 其他未知异常  系统异常提示
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/myTask/queryMyStartTaskList')")
    @Parameter(name = "pageReq", description = "分页请求对象", required = true)
    @Operation(summary = "分页查询我的发起任务列表")
    @PostMapping("/queryMyStartTaskList")
    public Result<MyStartTaskListInfoVO> queryMyStartTaskList(@RequestBody PageReq pageReq) {
        try {
            // 调用业务层方法，查询出来的分页数据
            return Result.success(mayTaskService.queryMyStartTaskList(pageReq));
        } catch (Exception e) {
            log.error("查询我的发起任务列表失败，原因：{}", e.getMessage());
            return Result.error("查询我的发起任务列表失败，原因：" + e.getMessage());
        }
    }

    /**
     * 查询流转记录。
     * <p>
     * 权限: /api/v1/myTask/queryCirculationRecords
     * 参数: queryCirculationRecordsReq - 请求对象，包含查询所需参数
     * 返回: Result<List<CirculationRecordsVO>> 返回封装后的流转记录列表数据
     * <p>
     * 异常处理：
     * - 业务层异常  返回查询流转记录失败信息
     * - 其他未知异常  系统异常提示
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/myTask/queryCirculationRecords')")
    @Parameter(name = "queryCirculationRecordsReq", description = "查询流转记录请求对象", required = true)
    @Operation(summary = "查询流转记录")
    @PostMapping("/queryCirculationRecords")
    public Result<List<CirculationRecordsVO>> queryCirculationRecords(@RequestBody QueryCirculationRecordsReq queryCirculationRecordsReq) {
        try {
            // 调用业务层方法，查询流转记录
            return Result.success(mayTaskService.queryCirculationRecords(queryCirculationRecordsReq));
        } catch (Exception e) {
            log.error("查询流转记录失败，原因：{}", e.getMessage());
            return Result.error("查询流转记录失败，原因：" + e.getMessage());
        }
    }

    /**
     * 分页查询我的完成任务列表。
     * <p>
     * 权限: /api/v1/myTask/queryMyCompleteTaskList
     * 参数: pageReq - 分页请求对象，用于指定分页信息（页码、页大小等）
     * 返回: Result<MyCompleteTaskListInfoVO> 返回封装后的分页任务列表信息
     * <p>
     * 异常处理：
     * - 业务层异常  返回查询任务列表失败信息
     * - 其他未知异常  系统异常提示
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/myTask/queryMyCompleteTaskList')")
    @Parameter(name = "pageReq", description = "分页请求对象", required = true)
    @Operation(summary = "分页查询我的完成任务列表")
    @PostMapping("queryMyCompleteTaskList")
    public Result<MyCompleteTaskListInfoVO> queryMyCompleteTaskList(@RequestBody PageReq pageReq) {
        try {
            // 调用业务层方法，查询出来的分页数据
            return Result.success(mayTaskService.queryMyCompleteTaskList(pageReq));
        } catch (Exception e) {
            log.error("查询我的完成任务列表失败，原因：{}", e.getMessage());
            return Result.error("查询我的完成任务列表失败，原因：" + e.getMessage());
        }
    }


}
